package mobileann.mafamily.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import mobileann.mafamily.act.eye.AlertActivity;
import mobileann.mafamily.act.main.FS;
import mobileann.mafamily.db.model.AppDetailModel;
import mobileann.mafamily.db.model.DeskPkgModel;
import mobileann.mafamily.db.model.NewMsgModel;
import mobileann.mafamily.entity.AppInfo;
import mobileann.mafamily.model.UDPSocket;

import org.json.JSONArray;
import org.json.JSONObject;

import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.ActivityManager.RecentTaskInfo;
import android.app.AppOpsManager;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Handler;
import android.provider.Settings;
import android.text.TextUtils;

import com.mofind.android.base.L;
import com.mofind.android.net.HttpUtils;
import com.mofind.android.net.HttpUtils.HttpResultCallback;
import com.mofind.android.net.JSONParser;
import com.mofind.java.utils.TimeUtils;

/**
 * 功能:应用详情管理类
 * @annotation Adrian.20151102
 */
public class AppDetailsManager {
	public static final String ADRIAN = "AppDetailsManager";
	
	
	private static AppDetailsManager g_Mgr = null;
	private String TAG = "AppDetailManger";
	public static final int GET_APPDETAIL = 358;
	public static final int GET_APPDETAIL_NULL = 359;
	// public static final int GET_MEMBERS = 360;
	// public static final int GET_MEMBERS_ERROR = 361;
	private String reader_appPkn1 = "com.chaozh.iReaderFree";// 掌阅iReader
	private String reader_appPkn2 = "com.qq.reader";// QQ阅读
	private String reader_appPkn3 = "com.ophone.reader.ui";// 和阅读
	private String reader_appPkn4 = "com.shuqi.controller";// 书旗小说
	private String reader_appPkn5 = "com.chaozh.iReaderFree15";// 爱读掌阅
	private String reader_appPkn6 = "com.qidian.QDReader";// 起点读书
	private String reader_appPkn7 = "com.dangdang.reader";// 当当读书
	private String reader_appPkn8 = "com.iyd.reader.ReadingJoy";// 爱阅读
	private String reader_appPkn9 = "com.netease.pris";// 网易云阅读
	private String reader_appPkn10 = "com.jingdong.app.reader";// 京东阅读
	private String reader_appPkn11 = "com.duokan.fiction";// 小米小说
	private String reader_appPkn12 = "com.duokan.reader";// 多看阅读
	private String reader_appPkn13 = "com.sogou.novel";// 搜狗阅读
	private String reader_appPkn14 = "com.xs.cn";// 小说阅读网
	private String reader_appPkn15 = "com.iBookStar.activity";// 阅读星
	private String reader_appPkn16 = "com.xxsyread";// 潇湘书院
	private String reader_appPkn17 = "com.esbook.reader";// 宜搜小说
	private String reader_appPkn18 = "com.jiasoft.swreader";// 安卓读书
	private String reader_appPkn19 = "com.lectek.android.sfreader";// 天翼阅读
	private String reader_appPkn20 = "cn.htjyb.reader";// 快读小说
	private String browser_appPkn1 = "com.qihoo360.mobilesafe";// 360浏览器
	private String browser_appPkn2 = "com.UCMobile";// UC浏览器
	private String browser_appPkn3 = "com.oupeng.browser";// 欧朋浏览器
	private String browser_appPkn4 = "com.tencent.mtt";// QQ浏览器
	private String browser_appPkn5 = "com.baidu.searchbox";// 手机百度
	private String browser_appPkn6 = "com.android.chrome";// Chrome浏览器
	private String browser_appPkn7 = "sogou.mobile.explorer";// 搜狗浏览器
	private String browser_appPkn8 = "com.funnylemon.browser";// VC浏览器
	private String browser_appPkn9 = "com.jiansou.search";// 简搜
	private String browser_appPkn10 = "org.mozilla.firefox";// FireFox
	private String browser_appPkn11 = "com.qihoo.haosou";// 360好搜
	private String browser_appPkn12 = "com.mx.browser";// 傲游云浏览器
	private String web_appPkn1 = "com.sina.weibo";// 新浪微博
	private String web_appPkn2 = "com.tencent.WBlog";// 腾讯微博
	//    private static final String filePath=FS.getInstance().getParentPath() + File.separator
	//		+ "appdetails" + File.separator + SPUtils.getUID();

	public synchronized static AppDetailsManager getInstance() {
		if (g_Mgr == null) {
			g_Mgr = new AppDetailsManager();
		}
		return g_Mgr;
	}

	// private class AppDetails {
	// String AppIdentity;
	// String AppName;
	// String StartTime;
	// String StopTime;
	// }

	public static class MaxPriorityThreadFactory implements ThreadFactory {
		public Thread newThread(Runnable r) {
			Thread t = new Thread(r);
			t.setPriority(Thread.MAX_PRIORITY); 
			return t;
		}
	}

	// Stack<AppDetails> stackAppLogs;
	/**记录三分钟的数据*/
	//	private List<AppInfo> appInfos;// 记录的三分钟的数据
	private AppInfo appInfo; // 记录当前正在使用的数据
	private ExecutorService executorReporting;
	/**赋值数据上传*/
	//	private List<AppInfo> doApps;// 赋值数据上传
	//	public List<String> listTop100Endtime ; //记录每次取得的前100条的数据, 便于删除
	List<String> deskpkgList;

	private AppDetailsManager() {
		// stackAppLogs = new Stack<AppDetails>();
		//		appInfos = new ArrayList<AppInfo>();
		executorReporting = Executors.newSingleThreadExecutor(new MaxPriorityThreadFactory());
		//		doApps = new ArrayList<AppInfo>();
		//		listTop100Endtime = new ArrayList<String>();
		AppDetailModel.delAppDetailsTabBefor8day(FS.getInstance());
	}

	/**
	 * 每隔一段时间, 就会记录当前使用的详情.
	 * @annotation Adrian
	 */
	private class runableLogAppDetails implements Runnable {
		@Override
		public void run() {
			//	    while (true) {
			while(FS.getLoginState()&& FS.screenon){
				try {
//					L.i(">>>>>"+SystemUtils.getInstance().getCurrentActivityName(FS.getInstance()));
//					L.i(">>>>>"+StartDetectionUtils.getMIUIVersion());
					doInternalLogAppDetails();
					Thread.sleep(3 * 1000); // 3s中循环一次
					String isUsingApp = SPUtils.getTopApp();
					long startTime = SPUtils.getIsUsingApp(isUsingApp);
					// 判断使用时长
					if (!TextUtils.isEmpty(isUsingApp) 
							&& System.currentTimeMillis() / 1000 - startTime >= 1800) {
						if (isUsingApp.equals(web_appPkn1)
								|| isUsingApp.equals(web_appPkn2)
								|| isUsingApp.equals(reader_appPkn1)
								|| isUsingApp.equals(reader_appPkn10)
								|| isUsingApp.equals(reader_appPkn11)
								|| isUsingApp.equals(reader_appPkn12)
								|| isUsingApp.equals(reader_appPkn13)
								|| isUsingApp.equals(reader_appPkn14)
								|| isUsingApp.equals(reader_appPkn15)
								|| isUsingApp.equals(reader_appPkn16)
								|| isUsingApp.equals(reader_appPkn17)
								|| isUsingApp.equals(reader_appPkn18)
								|| isUsingApp.equals(reader_appPkn19)
								|| isUsingApp.equals(reader_appPkn2)
								|| isUsingApp.equals(reader_appPkn20)
								|| isUsingApp.equals(reader_appPkn3)
								|| isUsingApp.equals(reader_appPkn4)
								|| isUsingApp.equals(reader_appPkn5)
								|| isUsingApp.equals(reader_appPkn6)
								|| isUsingApp.equals(reader_appPkn7)
								|| isUsingApp.equals(reader_appPkn8)
								|| isUsingApp.equals(reader_appPkn9)
								|| isUsingApp.equals(browser_appPkn1)
								|| isUsingApp.equals(browser_appPkn10)
								|| isUsingApp.equals(browser_appPkn11)
								|| isUsingApp.equals(browser_appPkn12)
								|| isUsingApp.equals(browser_appPkn2)
								|| isUsingApp.equals(browser_appPkn3)
								|| isUsingApp.equals(browser_appPkn4)
								|| isUsingApp.equals(browser_appPkn5)
								|| isUsingApp.equals(browser_appPkn6)
								|| isUsingApp.equals(browser_appPkn7)
								|| isUsingApp.equals(browser_appPkn8)
								|| isUsingApp.equals(browser_appPkn9)) {
							MySelfUtils.getInstance().setBrightnessMode(Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
							int screenLight = MySelfUtils.getInstance().getSysScreenBrightness();
							if (screenLight >= 51) {
								MySelfUtils.getInstance().setSysScreenBrightness(screenLight - 25);
							}
							Intent activityIntent = new Intent(FS.getInstance(), AlertActivity.class);
							// activityIntent
							// .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
							activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
									| Intent.FLAG_ACTIVITY_SINGLE_TOP
									| Intent.FLAG_ACTIVITY_CLEAR_TASK);
							FS.getInstance().startActivity(activityIntent);
							SPUtils.setIsUsingApp(isUsingApp, System.currentTimeMillis() / 1000);
							TimerTask task = new TimerTask() {
								public void run() {
									if (FS.getInstance().alertActivity != null) {
										FS.getInstance().alertActivity.finish();
									}
								}
							};
							Timer timer = new Timer();
							timer.schedule(task, 15 * 1000); // 每15s钟就执行一次
						}
					}
				} catch (InterruptedException e) {
					L.e("maf", "error--", e);
					break;
				}
			}
		}
	}

	public synchronized void AskPermissionOnL() {
		if (Build.VERSION.SDK_INT >= 21) {
			doAskPermissionOnL();
		} 
	}

	public synchronized boolean isNeedAskingPermissionOnL() {
		if (Build.VERSION.SDK_INT >= 21) {
			return needPermissionForBlocking(FS.getInstance());
		}
		return false;
	}

	@TargetApi(21)
	private void doAskPermissionOnL() {
		if (needPermissionForBlocking(FS.getInstance())) {
			Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
			if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0)
				intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			try {
				FS.getInstance().startActivity(intent);
			} catch (Exception e) {
				//handle exception
			}
		}
	}

	@TargetApi(21)
	private static class RecentUseComparator implements Comparator<UsageStats> {
		@Override
		public int compare(UsageStats lhs, UsageStats rhs) {
			return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1 : 
				(lhs.getLastTimeUsed() == rhs.getLastTimeUsed()) ? 0 : 1;
		}
	}

	@TargetApi(21)
	private boolean needPermissionForBlocking(Context context) {
		try {
			PackageManager packageManager = context.getPackageManager();
			ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
			AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
			int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid,
					applicationInfo.packageName);
			return (mode != AppOpsManager.MODE_ALLOWED);
		} catch (PackageManager.NameNotFoundException e) {
			return true;
		}
	}

	@TargetApi(21)
	private String getTopPackage() {
		long ts = System.currentTimeMillis();
		UsageStatsManager mUsageStatsManager = (UsageStatsManager) FS.getInstance().getSystemService("usagestats");
		List<UsageStats> usageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, ts - 10000, ts);
		if (usageStats == null) {
			return SPUtils.getLastPackageName();
			// return FS.getInstance().getPackageName();
		}
		if (usageStats.size() == 0) {
			// return FS.getInstance().getPackageName();
			return SPUtils.getLastPackageName(); // 如果Android5.0没有取到内容，返回空字符串
		}
		Collections.sort(usageStats, new RecentUseComparator());//给所有的应用排了一下序
		for (UsageStats us : usageStats) {
			// if
			// (!FS.getInstance().getPackageName().equals(us.getPackageName()))
			// {
			String pkgName = us.getPackageName();
			if (AppInfoUtils.isContain(pkgName)) {
				NewMsgModel model = new NewMsgModel(FS.getInstance());
				model.deleteMsgByPkg(pkgName, FS.getInstance());
			}
			SPUtils.setLastPackageName(pkgName);
			return pkgName;
			// }
		}
		return SPUtils.getLastPackageName();
		// return FS.getInstance().getPackageName();
	}

	private String getTopPackageUnderL() {
		ActivityManager am = (ActivityManager) FS.getInstance()
				.getSystemService(android.content.Context.ACTIVITY_SERVICE);
		PackageManager pm = FS.getInstance().getPackageManager();

		List<RecentTaskInfo> tasks = am.getRecentTasks(2, 1);
		if ((tasks == null) || (tasks.size() == 0)) {
			return FS.getInstance().getPackageName();
		}
		//
		for (RecentTaskInfo info : tasks) {
			Intent it = info.baseIntent;
			ResolveInfo ri = pm.resolveActivity(it, 0);
			if (ri != null) {
				String pkgName = ri.activityInfo.packageName;
				if (AppInfoUtils.isContain(pkgName)) {
					NewMsgModel model = new NewMsgModel(FS.getInstance());
					model.deleteMsgByPkg(pkgName, FS.getInstance());
				}
				return pkgName;
			}
		}
		return FS.getInstance().getPackageName();
	}

	/**
	 * 返回应用名称
	 */
	public String getAppName(Context c, String packageName) {
		PackageManager pm = c.getPackageManager();
		String strName = packageName;
		try {
			ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
			strName = pm.getApplicationLabel(ai).toString();
		} catch (NameNotFoundException e) {
			L.e("maf", "error--", e);
		}
		return strName;
	}

	//	/**@deprecated
	//	 *  发送应用详情,通过网络发送到服务 */
	//	private void doInternalLogAppDetails() {
	//		Log.i(ADRIAN1, "doInternalLogAppDetails");
	//		//L.i(SystemUtils.getInstance().getCurrentActivityName(FS.getInstance()));
	//		boolean b = false;
	//		//	String pkgname = FS.getInstance().getPackageName(); 
	//		String pkgname = SPUtils.getLastPackageName(); // to：解决父亲的更换Activity，只显示跟屁虫的问题 #ADRIAN.2015.7.24.12.29
	//		int sdkInt = Build.VERSION.SDK_INT;
	//		if (sdkInt >= 21) {
	//			boolean needPermission = !needPermissionForBlocking(FS.getInstance());
	//			if (needPermission) {
	//				pkgname = getTopPackage();
	//				// 如果字符串为空，则直接返回，不执行下面步骤 #ADRIAN
	//				// 修改：getTopPackage函数再次修改，其值应该不会返回“”，但保留.#ADRIAN.2016.7.24.12.05
	//				if (pkgname.equals("")) {
	//					return;
	//				}
	//				b = true;
	//			}
	//		}
	//		if (!b) {
	//			pkgname = getTopPackageUnderL();
	//		}
	//		Log.i(ADRIAN1, "doInternalLogAppDetails#agetTopPackage" + pkgname);
	//		// 获取应用的名称 @ADRIAN.20151106
	//		String label = getAppName(FS.getInstance(), pkgname);
	//		// 以上是获取包名------20151125是没有问题的-----------------
	//		L.i("-----" + appInfos);
	//		if (appInfos.size() > 0) {
	//			Log.i(ADRIAN1, "appInfos.size() > 0");
	//			AppInfo appInfo = appInfos.get(appInfos.size() - 1); // 取到最后一个数据,估计是用来比对 @ADRIAN.20151106
	//			if (appInfo.getPackageName().equalsIgnoreCase(pkgname)) {// 正在使用的软件没有改变
	//				Log.i(ADRIAN1,"正在使用的软件没有改变"); 
	//				if (appInfo.getEndTime() == 0) {// 没有结束时间
	//					//说明没有操作? 还不太清除 @ADRIAN.20151106 说明还正在使用 @ADRIAN.20151106
	//					Log.i(ADRIAN1,"appInfo.getEndTime() == 0"); 
	//				} else {// 已经结束，加入一个新的对象  换了一个当前正在使用的应用 @ADRIAN.20151106
	//					Log.i(ADRIAN1,"appInfo.getEndTime() != 0");
	//					String preApp = SPUtils.getTopApp();
	//					Log.i(ADRIAN1, "SPUtils.getTopApp(); preApp " + preApp);
	//					if (!pkgname.equalsIgnoreCase(preApp)) {// 正在使用的APP改变
	//						SPUtils.setIsUsingApp(preApp, 0);// 将之前赋值的app的开启时间置为0
	//						SPUtils.setTopApp(pkgname);// 将正在使用的app名称改变
	//						SPUtils.setIsUsingApp(pkgname, System.currentTimeMillis() / 1000);// 将正在使用的软件的开启时间赋值
	//					}
	//					AppInfo appNew = new AppInfo();
	//					appNew.setAppName(label);
	//					appNew.setPackageName(pkgname);
	//					appNew.setStartTime(System.currentTimeMillis() / 1000);
	//					appInfos.add(appNew);
	//					L.i("正在使用的软件没有改变----" + appNew);
	//					UDPSocket.getInstance(FS.getInstance()).sendIsUsingAppInfo(SPUtils.getFID(), SPUtils.getUID(), pkgname, label);
	//				}
	//			} else { // 正在使用的时间已经改变了 @ADRIAN.20151106
	//				Log.i(ADRIAN1,"正在使用的软件没有改变"); 
	//				if (appInfo.getEndTime() == 0) {
	//					appInfo.setEndTime(System.currentTimeMillis() / 1000);
	//					if(appInfo.getStartTime()<appInfo.getEndTime()){ // 当有应用程序改变时, 就加入到数据库
	//						AppDetailModel.insertAppInfo(FS.getInstance(), appInfo); // 应用程序改变才写入数据库中,否则不写入
	//						L.i("insert into databases appInfo " + appInfo);
	//					}
	//				}
	//				String preApp = SPUtils.getTopApp();
	//				if (!pkgname.equalsIgnoreCase(preApp)) {// 正在使用的APP改变
	//					SPUtils.setIsUsingApp(preApp, 0);// 将之前赋值的app的开启时间置为0
	//					SPUtils.setTopApp(pkgname);// 将正在使用的app名称改变
	//					SPUtils.setIsUsingApp(pkgname, System.currentTimeMillis() / 1000);// 将正在使用的软件的开启时间赋值
	//				}
	//				AppInfo appNew = new AppInfo();
	//				appNew.setAppName(label);
	//				appNew.setPackageName(pkgname);
	//				appNew.setStartTime(System.currentTimeMillis() / 1000);
	//				appInfos.add(appNew);
	//				UDPSocket.getInstance(FS.getInstance()).sendIsUsingAppInfo(SPUtils.getFID(), SPUtils.getUID(), pkgname, label);
	//			}
	//		} else {
	//			Log.i(ADRIAN1, "appInfos.size() < 0");
	//			String preApp = SPUtils.getTopApp();
	//			if (!pkgname.equalsIgnoreCase(preApp)) {// 正在使用的APP改变
	//				SPUtils.setIsUsingApp(preApp, 0);// 将之前赋值的app的开启时间置为0
	//				SPUtils.setTopApp(pkgname);// 将正在使用的app名称改变
	//				SPUtils.setIsUsingApp(pkgname, System.currentTimeMillis() / 1000);// 将正在使用的软件的开启时间赋值
	//			}
	//			AppInfo appNew = new AppInfo();
	//			appNew.setAppName(label);
	//			appNew.setPackageName(pkgname);
	//			appNew.setStartTime(System.currentTimeMillis() / 1000);
	//			appInfos.add(appNew);
	//			L.i("大小小于0    " + appInfos.toString());
	//			// '正在使用的应用'发送给服务器 @ADRIAN.20151106
	//			UDPSocket.getInstance(FS.getInstance()).sendIsUsingAppInfo(SPUtils.getFID(), SPUtils.getUID(), pkgname, label);
	//		}
	//	}

	/** 发送应用详情,通过网络发送到服务 */
	private void doInternalLogAppDetails() {
		//L.i(SystemUtils.getInstance().getCurrentActivityName(FS.getInstance()));
		boolean b = false;
		//	String pkgname = FS.getInstance().getPackageName(); 
		String pkgname = SPUtils.getLastPackageName(); // to：解决父亲的更换Activity，只显示跟屁虫的问题 #ADRIAN.2015.7.24.12.29
		int sdkInt = Build.VERSION.SDK_INT;
		if (sdkInt >= 21) {
			boolean needPermission = !needPermissionForBlocking(FS.getInstance());
			if (needPermission) {
				pkgname = getTopPackage();
				// 如果字符串为空，则直接返回，不执行下面步骤 #ADRIAN
				// 修改：getTopPackage函数再次修改，其值应该不会返回“”，但保留.#ADRIAN.2016.7.24.12.05
				if (pkgname.equals("")) {
					return;
				}
				b = true;
			}
		}
		if (!b) {
			pkgname = getTopPackageUnderL();
		}
		// 获取应用的名称 @ADRIAN.20151106
		String label = getAppName(FS.getInstance(), pkgname);
		// 以上是获取包名------20151125是没有问题的-----------------
		if(appInfo == null){
			appInfo = new AppInfo();
			appInfo.setUid(SPUtils.getUID());
			appInfo.setPackageName(pkgname);
			appInfo.setAppName(label);
			appInfo.setStartTime(TimeUtils.getCurrentAppdetailsTime()); // 开始时间
		}
		// 判断当前的包名跟上一个包名相同不相同
		if(appInfo.getPackageName().equalsIgnoreCase(pkgname)){
			// 相同-修改最后使用的时间
			appInfo.setPackageName(pkgname);
			appInfo.setAppName(label);
			// 开始时间不用改变, 但是必须改变相应的结束时间
			appInfo.setEndTime(TimeUtils.getCurrentAppdetailsTime());
		} else {
			// 不同-先存入数据库, 修改这个类中所有的数据 
			if (appInfo.getEndTime() == 0) {
				appInfo.setEndTime(TimeUtils.getCurrentAppdetailsTime());
			}
			AppDetailModel.insertAppInfo(FS.getInstance(), appInfo);
			appInfo.setPackageName(pkgname);
			appInfo.setAppName(label);
			appInfo.setStartTime(TimeUtils.getCurrentAppdetailsTime());
		}
		// 不管改变不改变 ,都应该上传当前正在使用的详情
		UDPSocket.getInstance(FS.getInstance()).sendIsUsingAppInfo(SPUtils.getFID(), SPUtils.getUID(), pkgname, label);
	}
		//		if (appInfos.size() > 0) {
		//			Log.i(ADRIAN1, "appInfos.size() > 0");
		//			AppInfo appInfo = appInfos.get(appInfos.size() - 1); // 取到最后一个数据,估计是用来比对 @ADRIAN.20151106
		//			if (appInfo.getPackageName().equalsIgnoreCase(pkgname)) {// 正在使用的软件没有改变
		//				Log.i(ADRIAN1,"正在使用的软件没有改变"); 
		//				if (appInfo.getEndTime() == 0) {// 没有结束时间
		//					//说明没有操作? 还不太清除 @ADRIAN.20151106 说明还正在使用 @ADRIAN.20151106
		//					Log.i(ADRIAN1,"appInfo.getEndTime() == 0"); 
		//				} else {// 已经结束，加入一个新的对象  换了一个当前正在使用的应用 @ADRIAN.20151106
		//					Log.i(ADRIAN1,"appInfo.getEndTime() != 0");
		//					String preApp = SPUtils.getTopApp();
		//					Log.i(ADRIAN1, "SPUtils.getTopApp(); preApp " + preApp);
		//					if (!pkgname.equalsIgnoreCase(preApp)) {// 正在使用的APP改变
		//						SPUtils.setIsUsingApp(preApp, 0);// 将之前赋值的app的开启时间置为0
		//						SPUtils.setTopApp(pkgname);// 将正在使用的app名称改变
		//						SPUtils.setIsUsingApp(pkgname, System.currentTimeMillis() / 1000);// 将正在使用的软件的开启时间赋值
		//					}
		//					AppInfo appNew = new AppInfo();
		//					appNew.setAppName(label);
		//					appNew.setPackageName(pkgname);
		//					appNew.setStartTime(System.currentTimeMillis() / 1000);
		//					appInfos.add(appNew);
		//					L.i("正在使用的软件没有改变----" + appNew);
		//					UDPSocket.getInstance(FS.getInstance()).sendIsUsingAppInfo(SPUtils.getFID(), SPUtils.getUID(), pkgname, label);
		//				}
		//			} else { // 正在使用的时间已经改变了 @ADRIAN.20151106
		//				Log.i(ADRIAN1,"正在使用的软件没有改变"); 
		//				if (appInfo.getEndTime() == 0) {
		//					appInfo.setEndTime(System.currentTimeMillis() / 1000);
		//					if(appInfo.getStartTime()<appInfo.getEndTime()){ // 当有应用程序改变时, 就加入到数据库
		//						AppDetailModel.insertAppInfo(FS.getInstance(), appInfo); // 应用程序改变才写入数据库中,否则不写入
		//						L.i("insert into databases appInfo " + appInfo);
		//					}
		//				}
		//				String preApp = SPUtils.getTopApp();
		//				if (!pkgname.equalsIgnoreCase(preApp)) {// 正在使用的APP改变
		//					SPUtils.setIsUsingApp(preApp, 0);// 将之前赋值的app的开启时间置为0
		//					SPUtils.setTopApp(pkgname);// 将正在使用的app名称改变
		//					SPUtils.setIsUsingApp(pkgname, System.currentTimeMillis() / 1000);// 将正在使用的软件的开启时间赋值
		//				}
		//				AppInfo appNew = new AppInfo();
		//				appNew.setAppName(label);
		//				appNew.setPackageName(pkgname);
		//				appNew.setStartTime(System.currentTimeMillis() / 1000);
		//				appInfos.add(appNew);
		//				UDPSocket.getInstance(FS.getInstance()).sendIsUsingAppInfo(SPUtils.getFID(), SPUtils.getUID(), pkgname, label);
		//			}
		//		} else {
		//			Log.i(ADRIAN1, "appInfos.size() < 0");
		//			String preApp = SPUtils.getTopApp();
		//			if (!pkgname.equalsIgnoreCase(preApp)) {// 正在使用的APP改变
		//				SPUtils.setIsUsingApp(preApp, 0);// 将之前赋值的app的开启时间置为0
		//				SPUtils.setTopApp(pkgname);// 将正在使用的app名称改变
		//				SPUtils.setIsUsingApp(pkgname, System.currentTimeMillis() / 1000);// 将正在使用的软件的开启时间赋值
		//			}
		//			AppInfo appNew = new AppInfo();
		//			appNew.setAppName(label);
		//			appNew.setPackageName(pkgname);
		//			appNew.setStartTime(System.currentTimeMillis() / 1000);
		//			appInfos.add(appNew);
		//			L.i("大小小于0    " + appInfos.toString());
		//			// '正在使用的应用'发送给服务器 @ADRIAN.20151106
		//			UDPSocket.getInstance(FS.getInstance()).sendIsUsingAppInfo(SPUtils.getFID(), SPUtils.getUID(), pkgname, label);
		//		}
//	}

	/*	private void reportByFile() {
		if (appInfos.size() > 0) {
			AppInfo appTop = appInfos.get(appInfos.size() - 1);
			appTop.setEndTime(System.currentTimeMillis() / 1000);
			doApps.addAll(appInfos);
			appInfos.clear();
			if (NetUtils.getInstance().netstate() == 0) {// 没有联网直接放在文件中
				saveFile(doApps);
				doApps.clear();
			} else {// 联网时先判断有没有正在上传数据
				String path = FS.getInstance().getParentPath() + "/appdetails/"
						+ SPUtils.getUID() + "/data.ma";
				StringBuilder sb = FileUtils.readFile(path, "UTF-8");
				if (sb != null) {// 文件里面有没有上传的数据
					Gson gson = new Gson();
					List<AppInfo> apps = gson.fromJson("[" + sb.toString()
							+ "]", new TypeToken<List<AppInfo>>() {
					}.getType());
					doApps.addAll(apps);
				}
				List<String> pkgNames = new ArrayList<String>();
				List<String> appNames = new ArrayList<String>();
				List<List<Long>> times = new ArrayList<List<Long>>();
				for (int i = 0; i < doApps.size(); i++) {
					AppInfo app1 = doApps.get(i);
					pkgNames.add(app1.getPackageName());
					appNames.add(app1.getAppName());
					List<Long> timeList = new ArrayList<Long>();
					timeList.add(app1.getStartTime());
					timeList.add(app1.getEndTime());
					times.add(timeList);
				}
				if (!SPUtils.getIsToServer()) {// 如果没有正在上传数据，就开始上传数据
					SPUtils.setIsToServer(true);
					doAppDetail2Server(pkgNames, appNames, times,null);
				} else {// 如果有，放在文件中
					saveFile(doApps);
					doApps.clear();
				}
			}
		}
	}*/

	//	//  这是使用数据库的
	//	private void reportAppByDB() {
	//		if (appInfos.size() > 0) { // 给最后一条数据弄上结束时间
	//			AppInfo appTop = appInfos.get(appInfos.size() - 1);
	//			appTop.setEndTime(System.currentTimeMillis() / 1000);
	//			if(appTop.getStartTime()<appTop.getEndTime()){
	//				AppDetailModel.insertAppInfo(FS.getInstance(), appTop);
	//			}
	//			appInfos.clear();
	//		}
	//		if (NetUtils.getInstance().netstate() == 0) {// 没有联网不清除数据库数据
	//		} else {// 联网时先判断有没有正在上传数据
	//			if (!SPUtils.getIsToServer()) {// 如果没有正在上传数据，就开始上传数据
	//				List<AppInfo> apps = AppDetailModel.queryAppDetails(FS.getInstance());
	//				List<String> pkgNames = new ArrayList<String>();
	//				List<String> appNames = new ArrayList<String>();
	//				List<List<Long>> times = new ArrayList<List<Long>>();
	//				if (apps != null) {
	//					if (apps.size() > 0) {
	//						for (int i = 0, count = apps.size(); i < count; i++) {
	//							AppInfo app1 = apps.get(i);
	//							if (deskpkgList == null) { //这个东西基本上是固定的, 不需要每次都去数据库中去取
	//								deskpkgList = DeskPkgModel.queryDeskPkgs(FS.getInstance());
	//							}
	//							boolean isDeskApp = false;
	//							for (int j = 0; j < deskpkgList.size(); j++) {
	//								if (app1.getPackageName().equalsIgnoreCase(deskpkgList.get(j))) {
	//									isDeskApp = true;
	//									break;
	//								}
	//							}
	//							if (!isDeskApp) {//判断是否是桌面
	//								pkgNames.add(app1.getPackageName());
	//								appNames.add(app1.getAppName());
	//								List<Long> timeList = new ArrayList<Long>();
	//								timeList.add(app1.getStartTime());
	//								timeList.add(app1.getEndTime());
	//								times.add(timeList);
	//							}
	//						}
	//						if (pkgNames.size() > 0) {
	//							doAppDetail2Server(pkgNames, appNames, times,null);
	//						} else {
	//							AppDetailModel.delAppDetailsTab(FS.getInstance());
	//						}
	//					}
	//				}
	//			} else {// 如果有正在上传的数据, 不进行任何操作
	//				return ;
	//			}
	//		}
	//	}

	//  这是使用数据库的, 每次读取100条上传
	private void reportAppByDBWithTop100() {
		//		L.v("reportAppByDBWithTop100");
		//		if (appInfos.size() > 0) { // 给最后一条数据弄上结束时间
		//			Log.i(ADRIAN2, "appInfos.size() > 0");
		//			AppInfo appTop = appInfos.get(appInfos.size() - 1);
		//			appTop.setEndTime(System.currentTimeMillis() / 1000);
		//			Log.i(ADRIAN2, "reportAppByDBWithTop100 -> " + appTop);
		//			Log.i(ADRIAN2, "reportAppByDBWithTop100" + (System.currentTimeMillis() / 1000));
		//			if(appTop.getStartTime()<appTop.getEndTime()){
		//				AppDetailModel.insertAppInfo(FS.getInstance(), appTop);
		//			}
		//			Log.i(ADRIAN2, "before clear appinfos's size : "+appInfos.size());
		//			appInfos.clear();
		//		}

		if (appInfo == null) {
			// 如果数据为空, 则重新刷新当前正在使用的应用程序
			return ;
			//			doInternalLogAppDetails();
		}
		// 将该应用设置最后的结束时间记录到本地, 说明要上传了
		appInfo.setEndTime(TimeUtils.getCurrentAppdetailsTime());
		AppDetailModel.insertAppInfo(FS.getInstance(), appInfo);
		// 最后将数据清空, 开始下一轮的记录
		appInfo = null;

		if (NetUtils.getInstance().netstate() == 0) {// 没有联网不清除数据库数据
		} else {// 联网时先判断有没有正在上传数据
			if (!SPUtils.getIsToServer()) {// 如果没有正在上传数据，就开始上传数据
				final List<AppInfo> apps = AppDetailModel.queryAppDetailsTop100(FS.getInstance());
				if (apps.size() < 2) {
					return; // fang zhi si xuan huan
				}
				List<String> pkgNames = new ArrayList<String>();
				List<String> appNames = new ArrayList<String>();
				List<List<Long>> times = new ArrayList<List<Long>>();
				if (apps != null) {
					if (apps.size() > 0) {
						for (int i = 0, count = apps.size(); i < count; i++) {
							AppInfo app1 = apps.get(i);
							List<String> deskpkgList = DeskPkgModel.queryDeskPkgs(FS.getInstance());
							boolean isDeskApp = false;
							for (int j = 0; j < deskpkgList.size(); j++) {
								if (app1.getPackageName().equalsIgnoreCase(deskpkgList.get(j))) {
									isDeskApp = true;
									break;
								}
							}
							if (!isDeskApp) {//判断是否是桌面
								pkgNames.add(app1.getPackageName());
								appNames.add(app1.getAppName());
								List<Long> timeList = new ArrayList<Long>();
								timeList.add(app1.getStartTime());
								timeList.add(app1.getEndTime());
								times.add(timeList);
							}
						}
						if (pkgNames.size() > 0) {
							//doAppDetail2ServerRecursion(pkgNames, appNames, times, null);
							//FileUtils.writeFileAsync(FileUtils.getDirAbsolutePathFromfilePath(FileUtils.MABABY_LOG + "log.txt"), pkgName, true);
							//							if (pkgNames.size() <= 0 || appNames.size() <= 0 || times.size() <= 0) {
							//								// 说明数据已经上传完
							//								//AppDetailModel.delAppDetailsTab(FS.getInstance());  // 似乎是数据上传完成后, 删除整个表, 但删除之后呢?好像就不能创建了
							//								return;
							//							}
							SPUtils.setIsToServer(true);
							HttpUtils.startHttpPost(URLUtils.URL_GROWTH_UPLOAD, 
									getAppDetailPara(SPUtils.getMySelf(SPUtils.MYUID), pkgNames, appNames, times),
									new HttpUtils.HttpResultCallback() {
								@Override
								public void result(String url, boolean isResult, String jsonStr) {
									if (isResult) {
										String result = TripleDESUtil.getJsonObjStr(SPUtils.getMySelf(SPUtils.MYUID),
												SPUtils.getMySelf(SPUtils.MYURAD), jsonStr);
										L.v("result   "  + result);
										JSONObject jo = JSONParser.getJSONObject(result);
										String status = JSONParser.getString(jo, "status");
										if (!TextUtils.isEmpty(status)) {
											if ("true".equals(status)) {
												L.v("<status is true >" + apps);
												AppDetailModel.delAppDetailsTab(FS.getInstance(), apps);
												//												for (int j = 0, count = apps.size(); j < count; j++) {
												//													AppDetailModel.delAppDetailsTab(FS.getInstance(), apps.get(j));
												//													//													AppDetailModel.delAppDetailsTab(FS.getInstance());
												//													L.v("deleteAppInfo   " + j);
												//												}
												SPUtils.setIsToServer(false);
												reportAppByDBWithTop100();
												//												doApps.clear();
											} else {
												L.e(TAG, "上传应用使用时长数据失败");
												return ;
											}
										} else {
											L.e(TAG, "ERROR");
											return ;
										}
									}
								}
							});
						} else {
							AppDetailModel.delAppDetailsTab(FS.getInstance());
						}
					}
				}
			} else {// 如果有
			}
		}
	}

	/*	private void saveFile(List<AppInfo> as) {
		Gson gson = new Gson();
		String jsonStr = gson.toJson(as);
		String data = jsonStr.substring(1, jsonStr.length() - 1);
		String path = FS.getInstance().getParentPath() + File.separator
				+ "appdetails" + File.separator + SPUtils.getUID()
				+ File.separator + "data.ma";
		if (FileUtils.isFileExist(path)) {
			data = "," + data;
		}
		try {
			FileUtils.writeFile(path, data,true);
		} catch (Exception e) {
		}
	}*/

	/**
	 * @deprecated
	 */
	private void delFile() {
		File file = new File(FS.getInstance().getParentPath() + File.separator
				+ "appdetails" + File.separator + SPUtils.getUID()
				+ File.separator + "data.ma");
		if (file.isFile()) {
			file.delete();
			return;
		}
	}

	// private void reportAppDetails() {
	// if (stackAppLogs.size() > 0 ) {
	// SimpleDateFormat sDateFormat = new SimpleDateFormat(
	// "yyyy-MM-dd HH:mm:ss", Locale.CHINA);
	// String time = sDateFormat.format(new java.util.Date());
	// AppDetails appTop = stackAppLogs.peek();
	// appTop.StopTime = time;
	// // for (AppDetails app : stackAppLogs) {
	// // UDPSocket.getInstance(FS.getInstance()).sendAppDetails(
	// // SPUtils.getFID(), SPUtils.getUID(), app.AppIdentity,
	// // app.AppName, app.StartTime, app.StopTime);
	// //
	// //
	// // }
	// //
	// List<String> pkgNames = new ArrayList<String>();
	// List<String> appNames = new ArrayList<String>();
	// List<List<Long>> times = new ArrayList<List<Long>>();
	// for (int i = 0; i < stackAppLogs.size(); i++) {
	// AppDetails app1 = stackAppLogs.get(i);
	// pkgNames.add(app1.AppIdentity);
	// appNames.add(app1.AppName);
	// List<Long> timeList = new ArrayList<Long>();
	// timeList.add(getSeconds(app1.StartTime));
	// timeList.add(getSeconds(app1.StopTime));
	// times.add(timeList);
	// }
	// // 筛选
	// // for (int m = 0; m < pkgNames.size()-1; m++) {
	// // for(int n=m+1;n<pkgNames.size();n++){
	// // if(pkgNames.get(m).equals(pkgNames.get(n))){
	// //
	// // }
	// // }
	// // }
	//
	// doAppDetail2Server(pkgNames, appNames, times);
	// // stackAppLogs.clear();
	// //
	// }
	// }


	/**
	 * <li> LogByRtc() mobileann.mafamily.utils.AppDetailsManager </li>
	 * <li> logout() mobileann.mafamily.act.main.FS </li>
	 * <li> logout(Activity) mobileann.mafamily.act.main.FS </li>
	 * <li> ReportHisTime2Server()  mobileann.mafamily.act.main.FS </li>
	 * <li> screenOff()  mobileann.mafamily.service.MainService </li>
	 *  上报应用详情数据到服务器 @ADRIAN.20151106 */
	public synchronized void ReportAppDetails() {
		executorReporting.submit(new Runnable() {

			@Override
			public void run() {
				scheduleReportAppDetails();
			}

		});
	}

	/**
	 * <li> 上报详情数据到服务器  </li>
	 * <li> ReportAppDetails  mobileann.mafamily.utils.AppDetailsManager.ReportAppDetails </li>
	 */
	private void scheduleReportAppDetails() {
		L.i("scheduleReportAppDetails");
		// stopLog();
		// reportAppDetails();
		// reportByFile();
		//	reportAppByDB();
		//		save2File();
		//		report2Server();
		reportAppByDBWithTop100(); // by ADRIAN.20151123
	}

	public void stopLog() {
		if (thdLogApp != null) {
			try {
				thdLogApp.interrupt();
				thdLogApp.join();
			} catch (InterruptedException e) {
				L.e("maf", "error--", e);
			}
			thdLogApp = null;
		}
	}

	private void startLog() {
		stopLog();
		restart();
	}

	public Thread thdLogApp = null;

	public synchronized void LogAppDetails() {
		startLog();
	}

	public synchronized void LogByRtc() {
		// stopLog();
		ReportAppDetails();
		// restart();
	}

	private void restart() {
		thdLogApp = new Thread(new runableLogAppDetails());
		thdLogApp.setName("logAppdetails_thread");
		if (thdLogApp != null)
			thdLogApp.start();
	}

	/**
	 * 上传应用使用时长的参数
	 * 
	 * @param c
	 * @param uid
	 *            用户uid2
	 * @param key
	 *            包名
	 * @param appname
	 *            应用名
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @return
	 */
	private Map<String, String> getAppDetailPara(String uid, List<String> pkgName, List<String> appName, List<List<Long>> times) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("from", "add_app");
		map.put("uid", uid);
		// map.put("data", TripleDESUtil.CBCEncode(SPUtils.getUID2(),
		// SPUtils.getURAD(), getAppDetailData(pkgName, appName, times)));
		map.put("data", TripleDESUtil.CBCEncode(
				SPUtils.getMySelf(SPUtils.MYUID),
				SPUtils.getMySelf(SPUtils.MYURAD),
				getAppDetailData(pkgName, appName, times)));
		return map;
	}

	/** 将记录的应用详情数组转换成需要的字符串  @ADRIAN.20151106 */
	private String getAppDetailData(List<String> pkgName, List<String> appName, List<List<Long>> times) {
		List<String> datas = new ArrayList<String>();
		for (int i = 0; i < pkgName.size(); i++) {
			List<Long> timeList = times.get(i);
			String timeString = "[";
			Map<String, String> map = new HashMap<String, String>();
			map.put("pk_name", "\"" + pkgName.get(i) + "\"");
			map.put("name", "\"" + appName.get(i) + "\"");
			for (int j = 0; j < timeList.size();) {
				if (j != 0) {
					timeString = timeString + ",";
				}

				timeString = timeString + "[" + timeList.get(j) + ","
						+ timeList.get(j + 1) + "]";
				j = j + 2;
				if (j >= timeList.size()-1) {
					timeString = timeString + "]";
				}
			}
			map.put("time", timeString);
			datas.add(MyTaskUtils.getInstance().map2json2(map));
		}
		Pattern p = Pattern.compile("\\s*|\r|\n");  
		Matcher m = p.matcher(datas.toString());  
		return m.replaceAll("");//去除字符串中所有的空格和换行符
	}

	private String getQueryString(String date, String uid, String urad) {
		String queryStr = uid + "_" + urad + "_" + date + "_app";
		return queryStr;
	}

	//	/**
	//	 * @deprecated  改成doAppDetail2ServerRecursion, 每次调用100条
	//	 * @param pkgName
	//	 * @param appName
	//	 * @param times
	//	 * @param filenames
	//	 */
	//	public void doAppDetail2Server(List<String> pkgName, List<String> appName,
	//			List<List<Long>> times,final List<String> filenames) {
	//		FileUtils.writeFileAsync(FileUtils.getDirAbsolutePathFromfilePath(FileUtils.MABABY_LOG + "log.txt"), pkgName, true);
	//		SPUtils.setIsToServer(true);
	//		HttpUtils.startHttpPost(URLUtils.URL_GROWTH_UPLOAD,
	//				getAppDetailPara(SPUtils.getMySelf(SPUtils.MYUID), pkgName, appName, times),
	//				new HttpUtils.HttpResultCallback() {
	//			@Override
	//			public void result(String url, boolean isResult, String jsonStr) {
	//				if (isResult) {
	//					SPUtils.setIsToServer(false);
	//					String result = TripleDESUtil.getJsonObjStr(SPUtils.getMySelf(SPUtils.MYUID),
	//							SPUtils.getMySelf(SPUtils.MYURAD), jsonStr);
	//					JSONObject jo = JSONParser.getJSONObject(result);
	//					String status = JSONParser.getString(jo, "status");
	//					if (!TextUtils.isEmpty(status)) {
	//						if ("true".equals(status)) {
	//							// stackAppLogs.clear();
	//							// appInfos.clear();
	//							AppDetailModel.delAppDetailsTab(FS.getInstance());
	//							//							doApps.clear();
	//							delFile();
	//							if(filenames!=null){
	//								for(int i=0;i<filenames.size();i++){
	//									FileUtils.deleteFile(FS.getInstance().getParentPath() + File.separator
	//											+ "appdetails" + File.separator + SPUtils.getUID()+File.separator+filenames.get(i));
	//								}
	//							}
	//						} else {
	//							L.e(TAG, "上传应用使用时长数据失败");
	//						}
	//					} else {
	//						L.e(TAG, "ERROR");
	//					}
	//				}
	//			}
	//		});
	//	}

	//	/**
	//	 * @deprecated 
	//	 * @param pkgName
	//	 * @param appName
	//	 * @param times
	//	 * @param listId2StoptimeDelete
	//	 */
	//	public void doAppDetail2ServerRecursion(List<String> pkgName, List<String> appName,
	//			List<List<Long>> times,final List<String> listId2StoptimeDelete) {
	//		//		FileUtils.writeFileAsync(FileUtils.getDirAbsolutePathFromfilePath(FileUtils.MABABY_LOG + "log.txt"), pkgName, true);
	//		SPUtils.setIsToServer(true);
	//		HttpUtils.startHttpPost(URLUtils.URL_GROWTH_UPLOAD, getAppDetailPara(SPUtils.getMySelf(SPUtils.MYUID), pkgName, appName, times),
	//				new HttpUtils.HttpResultCallback() {
	//			@Override
	//			public void result(String url, boolean isResult, String jsonStr) {
	//				if (isResult) {
	//					SPUtils.setIsToServer(false);
	//					String result = TripleDESUtil.getJsonObjStr(SPUtils.getMySelf(SPUtils.MYUID),
	//							SPUtils.getMySelf(SPUtils.MYURAD), jsonStr);
	//					JSONObject jo = JSONParser.getJSONObject(result);
	//					String status = JSONParser.getString(jo, "status");
	//					if (!TextUtils.isEmpty(status)) {
	//						if ("true".equals(status)) {
	//							//							doApps.clear();
	//						} else {
	//							L.e(TAG, "上传应用使用时长数据失败");
	//						}
	//					} else {
	//						L.e(TAG, "ERROR");
	//						return ;
	//					}
	//				}
	//			}
	//		});
	//	}

	/**
	 * 获取应用使用时长
	 * 得到需要日期的应用详情的数据
	 * @param date
	 *            获取的是哪一天
	 *            [{"pk_name":"com.mobileann.mafamily","name":"\u8ddf\u5c41\u866b"
	 *            ,"time":[[1418886506,1418886806],[1418887555,1418887595]]},{
	 *            "pk_name"
	 *            :"com.android.mms","name":"\u5fae\u4fe1","time":[[1418886506
	 *            ,1418886706],[1418887555,1418887955]]}]
	 */
	public void getAppDetailInfo(String date, final String uid,	final String urad, final Handler handler) {
		final List<AppInfo> appInfos = new ArrayList<AppInfo>();
		HttpUtils.startHttpGet(URLUtils.URL_TASK_GET + getQueryString(date, uid, urad),
				new HttpUtils.HttpResultCallback() {
			@Override
			public void result(String url, boolean isResult, String jsonStr) {
				if (isResult) {
					try {
						String json = TripleDESUtil.getJsonArrStr(uid, urad, jsonStr);
						JSONArray ja = JSONParser.getJSONArray(json);
						if (ja.length() == 0 || TextUtils.isEmpty(json)) {
							handler.obtainMessage(GET_APPDETAIL_NULL).sendToTarget();
						} else {
							for (int i = 0; i < ja.length(); i++) {
								JSONObject jo = ja.getJSONObject(i);
								String pkgName = jo.getString("pk_name");
								String name = jo.getString("name");
								JSONArray timeArray = jo.getJSONArray("time");
								for (int j = 0; j < timeArray.length(); j++) {
									String startTime = timeArray.getJSONArray(j).getString(0);
									String endTime = timeArray.getJSONArray(j).getString(1);
									AppInfo appInfo = new AppInfo();
									appInfo.setPackageName(pkgName);
									appInfo.setAppName(name);
									appInfo.setStartTime(Long.parseLong(startTime) * 1000);
									appInfo.setEndTime(Long.parseLong(endTime) * 1000);
									appInfos.add(appInfo);
								}
							}
							if (handler != null) {
								handler.obtainMessage(GET_APPDETAIL, appInfos).sendToTarget();
							}
						}
					} catch (Exception e) {
						L.e("maf", "error--", e);
					}
				}
			}
		});
	}

	/** 从服务器获取包名 */
	public void getDeskPkg(final Context c) {
		HttpUtils.startHttpGet(URLUtils.URL_TASK_GET + "1_list_desktop",
				new HttpResultCallback() {
			@Override
			public void result(String url, boolean isResult, String jsonStr) {
				if (isResult) {
					String json = TripleDESUtil.getJsonObjStr("1", "list", jsonStr);
					L.i(json);
					if (!TextUtils.isEmpty(json)) {
						JSONObject jo = JSONParser.getJSONObject(json);
						String status = JSONParser.getString(jo, "status");
						if (TextUtils.isEmpty(status)) {
							SPUtils.setDeskAppDate(System.currentTimeMillis());
							DeskPkgModel.deleteDeskPkgTable(c); // 先将数据库清空, 然后再添加新的内容
							String data = JSONParser.getString(jo, "pk_name");
							if(!TextUtils.isEmpty(data)){
								String[] datas = data.split(",");
								for (int i = 0; i < datas.length; i++) {
									DeskPkgModel.insertDeskPkg(c, datas[i]);
								}
							}
						}
					}
				}
			}
		});
	}

	//	/**
	//	 * 计算今天之前n天的日期
	//	 * 计算今天到preday之前间隔的计量数 &ADRIAN.20151118
	//	 */
	//	private long getSeconds(int preday) {
	//		String dateString=TimeUtils.getToDayDate()+" "+"00:00:00";
	//		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
	//		Date date = null;
	//		try {
	//			date = dateFormat.parse(dateString);
	//		} catch (ParseException e) {
	//			L.e("maf", "error--", e);
	//		}
	//		// 得到毫秒数
	//		long milSecond = date.getTime();
	//		return milSecond / 1000-24*60*60*preday;
	//	}


	//    private long getSeconds(String dateString) {
	//	SimpleDateFormat dateFormat = new SimpleDateFormat(
	//		"yyyy-MM-dd HH:mm:ss");
	//	Date date = null;
	//	try {
	//	    date = dateFormat.parse(dateString);
	//	} catch (ParseException e) {
	//	    L.e("maf", "error--", e);
	//	}
	//	// 得到毫秒数
	//	long milSecond = date.getTime();
	//	return milSecond / 1000;
	//    }

	//	/**将文件转换成json文件,然后存储到本地*/
	//	public void save2File(){
	//		if (appInfos.size() > 0) {
	//			AppInfo appTop = appInfos.get(appInfos.size() - 1);
	//			appTop.setEndTime(System.currentTimeMillis() / 1000);
	//		}
	//		Gson gson = new Gson();
	//		String jsonStr = gson.toJson(appInfos);
	//		String data = jsonStr.substring(1, jsonStr.length() - 1);
	//		String path = FS.getInstance().getParentPath() + File.separator
	//				+ "appdetails" + File.separator + SPUtils.getUID()+ File.separator + System.currentTimeMillis()/1000+".txt";
	//		if(!SPUtils.getUID().equals("0")){//虽然线程中判断了是否在登录状态，但是当写文件的时候用户恰巧清除了数据，那uid就变为0了
	//			try {
	//				FileUtils.writeFile(path, data);
	//				appInfos.clear();
	//			} catch (Exception e) {
	//			}
	//		}else{
	//			appInfos.clear();
	//		}
	//	}

	//	/**
	//	 * @deprecated
	//	 * 要上传的文件名称
	//	 * <br>从本地获取 @ADRIAN.20161102
	//	 */
	//	private List<String> getReportFileName(int preday){
	//		List<String> allFileNames=new ArrayList<String>();
	//		long comTime=TimeUtils.getSeconds(preday-1);//preday天前的秒，如：2015-07-30 00:00:00
	//		//		File[] files = new File(FS.getInstance().getParentPath() + File.separator
	//		//				+ "appdetails" + File.separator + SPUtils.getUID()).listFiles();
	//		File[] files = new File(FileUtils.getDirAbsolutePathFromfilePath(FileUtils.MABABY_MAFAMILYSAFE_APPDETAILS)+ SPUtils.getUID()).listFiles();
	//		for (File file : files) { // 将所有的文件列出
	//			String data=file.getName().substring(0,file.getName().length()-4); // 文件名就是记录的时间
	//			long time=Long.parseLong(data); // 将字符转转换为long型数据
	//			if(preday==0){ 
	//				allFileNames.add(file.getName()); // 今天的数据, 因为是倒数, 所以是最后剩下的文件
	//			}else{
	//				if(time<comTime){
	//					if(preday==8){
	//						FileUtils.deleteFile(FileUtils.MABABY_MAFAMILYSAFE_APPDETAILS
	//								/*FS.getInstance().getParentPath() + File.separator + "appdetails" + File.separator + */
	//								+ SPUtils.getUID()+File.separator+file.getName());
	//					}else {
	//						allFileNames.add(file.getName());
	//					}
	//				}
	//			}
	//		}
	//		return allFileNames; 
	//	}

	//	/**字符串拼接,存取的时候去掉了 @ADRIAN.20151102*/
	//	private List<AppInfo> readFileData(String filename){
	//		List<AppInfo> apps=new ArrayList<AppInfo>();
	//		//		String path = FS.getInstance().getParentPath() + File.separator + "appdetails" + File.separator + SPUtils.getUID()+File.separator +filename;
	//		StringBuilder sb = FileUtils.readFile(FileUtils.getDirAbsolutePathFromfilePath(FileUtils.MABABY_MAFAMILYSAFE_APPDETAILS + SPUtils.getUID()+File.separator +filename), "UTF-8");
	//		if (sb != null) { // 文件里面有没有上传的数据
	//			Gson gson = new Gson();
	//			apps = gson.fromJson("[" + sb.toString() + "]", new TypeToken<List<AppInfo>>() {}.getType());
	//		}
	//		return apps;
	//	}

	//	/**将应用详情的json数据一股脑的发送到服务器 @ADRIAN.20151102*/
	//	public void report2Server(){
	//		L.i("report2Server");
	//		if (NetUtils.getInstance().netstate() == 0) {// 没有联网
	//			L.i("没有联网");
	//		} else {// 联网时
	//			L.i("联网  !SPUtils.getIsToServer()   --  " + !SPUtils.getIsToServer());
	//			if (!SPUtils.getIsToServer()) {// 如果没有正在上传数据，就开始上传数据
	//				List<String> filenames = new ArrayList<String>();
	//				for(int n=8; n>=0; n--){ //
	//					filenames=getReportFileName(n);
	//					L.i("report2Server#filenames"+filenames);
	//					if(filenames.size()!=0){//不是空的话要开始上报数据
	//						break;
	//					}
	//				}
	//				List<AppInfo> apps=new ArrayList<AppInfo>();
	//				if(filenames!=null){
	//					if(filenames.size()>0){
	//						for(int m=0; m<filenames.size() ;m++){
	//							apps.addAll(readFileData(filenames.get(m))); // 将所有的内容读取出来
	//						}
	//					}
	//				}
	//				List<String> pkgNames = new ArrayList<String>();
	//				List<String> appNames = new ArrayList<String>();
	//				List<List<Long>> times = new ArrayList<List<Long>>();
	//				if(apps!=null){
	//					if(apps.size()>0){
	//						List<String> deskpkgList = DeskPkgModel.queryDeskPkgs(FS.getInstance());
	//						for (int i = 0; i < apps.size();) {
	//							AppInfo app1 = apps.get(i);
	//							if(app1.getStartTime()>=app1.getEndTime()){//先去掉开启时间大于结束时间的
	//								apps.remove(i);//i不变
	//								if(apps.size()==0){
	//									for(int h=0;h<filenames.size();h++){
	//										FileUtils.deleteFile(FS.getInstance().getParentPath() + File.separator
	//												+ "appdetails" + File.separator + SPUtils.getUID()+File.separator+filenames.get(i));
	//									}
	//									break;
	//								}else{
	//									continue;
	//								}
	//							}
	//							// 完全跳过了这个步骤
	//							boolean isDeskPkg=false;
	//							for (int j = 0, count = deskpkgList.size(); j < count; j++) {//去掉桌面的包
	//								if (app1.getPackageName().equalsIgnoreCase(deskpkgList.get(j))) {
	//									isDeskPkg=true;
	//									apps.remove(i);
	//									if(apps.size()==0){
	//										for(int h=0, counts = filenames.size();h<counts;h++){
	//											FileUtils.deleteFile(FileUtils.MABABY_MAFAMILYSAFE_APPDETAILS+SPUtils.getUID()+File.separator+filenames.get(i));
	//											//FS.getInstance().getParentPath() + File.separator+ "appdetails" + File.separator + SPUtils.getUID()+File.separator+filenames.get(i));
	//										}
	//										break;
	//									}else{
	//										break;
	//									}
	//								}
	//							}
	//							//一系列删除之后，如果删没了，就将文件jia也删掉，并结束循环
	//							if(apps.size()==0){
	//								for(int h=0;h<filenames.size();h++){
	//									FileUtils.deleteFile(FileUtils.getDirAbsolutePathFromfilePath(FileUtils.MABABY_MAFAMILYSAFE_APPDETAILS) + SPUtils.getUID()+File.separator+filenames.get(i));
	//									//FS.getInstance().getParentPath() + File.separator
	//									//+ "appdetails" + File.separator + SPUtils.getUID()+File.separator+filenames.get(i));
	//								}
	//								break;
	//							}
	//							//如果还没有删没，将继续下一循环或者将数据整理
	//							if(isDeskPkg){
	//								continue;//如果是桌面的包，跳出本次循环
	//							}
	//							i++;
	//							if(apps.size()==1){
	//								pkgNames.add(app1.getPackageName());
	//								appNames.add(app1.getAppName());
	//								List<Long> timeList = new ArrayList<Long>();
	//								timeList.add(app1.getStartTime());
	//								timeList.add(app1.getEndTime());
	//								times.add(timeList);
	//								break;
	//							}else{
	//								//将相同包名的app的时间合并
	//								List<Long> timeList = new ArrayList<Long>();
	//								pkgNames.add(app1.getPackageName());
	//								appNames.add(app1.getAppName());
	//								timeList.add(app1.getStartTime());
	//								timeList.add(app1.getEndTime());
	//								for(int j=i+1;j<apps.size();){
	//									if(app1.getPackageName().equalsIgnoreCase(apps.get(j).getPackageName())){
	//										timeList.add(apps.get(j).getStartTime());
	//										timeList.add(apps.get(j).getEndTime());
	//										apps.remove(j);
	//									}else{
	//										j++;
	//									}
	//								}
	//								times.add(timeList);
	//							}
	//						}
	//					}
	//				}
	//				if(pkgNames.size()>0){
	//					doAppDetail2Server(pkgNames, appNames, times,filenames);
	//				}else{
	//
	//				}
	//				apps.clear();
	//			} 
	//		}
	//	}
}
